package pe.gob.foncodes.ssa.web.controller;

import java.text.SimpleDateFormat;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;

import pe.gob.foncodes.ssa.bs.common.controller.GenericController;
import pe.gob.foncodes.ssa.bs.common.util.Constante;
import pe.gob.foncodes.ssa.bs.common.util.ServiceException;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Modulo;
import pe.gob.foncodes.ssa.web.beans.ControlAccesoBean;
import pe.gob.foncodes.ssa.web.util.Impresion;

public class ReporteControlAccesoController extends GenericController {

    protected static Logger log = Logger.getLogger(ReporteControlAccesoController.class);
    private String busCodUsuario;
    private String busNomUsuario;
    private String busModulo;
    private java.util.Date busFecRegDesde;
    private java.util.Date busFecRegHasta;
    private java.util.Date txtToday;
    private List<Modulo> lstModulo;
    List<ControlAccesoBean> lstControlAcceso;

    @Override
    public void init() {
        this.busCodUsuario = "";
        this.busNomUsuario = "";
        this.busModulo = "-99";
        this.lstControlAcceso = new ArrayList<ControlAccesoBean>();
        Calendar c = new GregorianCalendar();
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        this.txtToday = c.getTime();
        this.busFecRegDesde= c.getTime();
        this.busFecRegHasta= c.getTime();
    }

    @Override
    public void search(ActionEvent event) throws Exception {
        this.busCodUsuario = (this.busCodUsuario == null) ? null : "%" + this.busCodUsuario.trim().toUpperCase() + "%";
        this.busNomUsuario = (this.busNomUsuario == null) ? null : this.busNomUsuario.trim().toUpperCase();
        String strNomUsuario = (this.busNomUsuario == null) ? null : "%" + this.busNomUsuario + "%";
        String formato = "dd/MM/yyyy";
        Long lngModulo = (this.busModulo.equals("-99")) ? null : Long.parseLong(this.busModulo);
        
        
        String sql = null;
        sql = "select usuario1_.COD_USUARIO as col_0_0_,";
        sql += " usuario1_.TXT_APELLIDO_PATERNO || ' ' || usuario1_.TXT_APELLIDO_MATERNO || ' ' || usuario1_.TXT_NOMBRES as col_1_0_,";
        sql += " cast(zonal0_.COD_ZONAL as varchar2(2)) as col_2_0_, zonal0_.TXT_ZONAL as col_3_0_, to_char(modulo3_.NID_MODULO) as col_4_0_,";
        sql += " modulo3_.TXT_MODULO as col_5_0_, general4_.TXT_PARAMETRO as col_6_0_,";
        sql += " to_char(controlacc2_.FEC_REGISTRO, 'dd/mm/yyyy HH:MI:SS') || ' - ' || to_char(controlacc2_.FEC_SALIDA, 'dd/mm/yyyy HH:MI:SS') as col_7_0_";
        sql += " from GEN.ZONAL zonal0_, SSA.USUARIO usuario1_ inner join SSA.CONTROL_ACCESO controlacc2_";
        sql += " on usuario1_.NID_USUARIO = controlacc2_.NID_USUARIO inner join (";
        sql += " SELECT m.nid_modulo, m.txt_modulo";
        sql += " FROM ssa.modulo m";
        sql += " WHERE m.flg_Activo = " + Constante.ESTADO_ACTIVO;
        if(lngModulo == null){
            sql += " START WITH m.nid_modulo_padre is null";
        }else{
            sql += " START WITH m.nid_modulo = " + lngModulo.toString();
        }        
        sql += " CONNECT BY PRIOR m.nid_modulo = m.nid_modulo_padre) modulo3_";
        sql += " on controlacc2_.NID_MODULO = modulo3_.NID_MODULO, SSA.GENERAL general4_";
        sql += " where controlacc2_.TIP_OPERACION = general4_.NID_GENERAL";
        sql += " and general4_.TXT_DOMINIO = 'TIPO_OPERACION'";
        sql += " and usuario1_.FLG_ACTIVO = " + Constante.ESTADO_ACTIVO;
        sql += " and usuario1_.COD_ZONAL = zonal0_.COD_ZONAL";
        
        if(this.busCodUsuario != null){
            sql += " and (UPPER(usuario1_.COD_USUARIO) LIKE '" + this.busCodUsuario + "')";
        }
        if(strNomUsuario != null){
            sql += " and (UPPER(usuario1_.TXT_APELLIDO_PATERNO || ' ' || usuario1_.TXT_APELLIDO_MATERNO || ' ' || usuario1_.TXT_NOMBRES) like '" + strNomUsuario + "')";
        }
        SimpleDateFormat dd = new SimpleDateFormat(formato);        
        if(this.busFecRegDesde !=null){
            sql += " and (to_date(to_char(controlacc2_.FEC_REGISTRO, 'DD/MM/YYYY'), 'DD/MM/YYYY') >= to_date('" + dd.format(this.busFecRegDesde) + "', 'DD/MM/YYYY'))";
        }
        if(this.busFecRegHasta != null){
            sql += " and (to_date(to_char(controlacc2_.FEC_REGISTRO, 'DD/MM/YYYY'), 'DD/MM/YYYY') <= to_date('" + dd.format(this.busFecRegHasta) +"', 'DD/MM/YYYY'))";
        }
        sql += " order by usuario1_.COD_USUARIO, controlacc2_.FEC_REGISTRO DESC, modulo3_.TXT_MODULO";

        List<Object[]> olstControlAcceso = getService().createNativeQuery(sql, new Object[]{});
        this.lstControlAcceso = new ArrayList<ControlAccesoBean>();
        for (Object[] obj : olstControlAcceso) {
            ControlAccesoBean oControlAcceso = new ControlAccesoBean();
            oControlAcceso.setCOD_USUARIO(obj[0].toString());
            oControlAcceso.setTXT_APENOM(obj[1].toString());
            oControlAcceso.setCOD_ZONAL(obj[2].toString());
            oControlAcceso.setTXT_ZONAL(obj[3].toString());
            oControlAcceso.setNID_MODULO(obj[4].toString());
            oControlAcceso.setTXT_MODULO(obj[5].toString());
            oControlAcceso.setTXT_PARAMETRO(obj[6].toString());
            oControlAcceso.setFEC_REGISTRO(obj[7].toString());
            this.lstControlAcceso.add(oControlAcceso);
        }
    }

    public void limpiar() {
        this.busCodUsuario = "";
        this.busNomUsuario = "";
        this.busModulo = "-99";
        Calendar c = new GregorianCalendar();
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        this.txtToday = c.getTime();
        this.busFecRegDesde= c.getTime();
        this.busFecRegHasta= c.getTime();
        this.lstControlAcceso = new ArrayList<ControlAccesoBean>();
    }

    public void print(int tipo) {
        try {
            Collection col = new ArrayList();
            for (ControlAccesoBean oControlAcceso : this.lstControlAcceso) {
                col.add(oControlAcceso);
            }
            String filtros = "";
            if (this.busCodUsuario != null && !this.busCodUsuario.equals("")) {
                filtros = String.format("%s %s , ", "Código usuario:", this.busCodUsuario);
            }
            if (this.busNomUsuario != null && !this.busNomUsuario.equals("")) {
                filtros = String.format("%s %s %s , ", filtros, "Nombre usuario:", this.busNomUsuario);
            }
             if (this.busFecRegDesde != null && this.busFecRegHasta != null) {
                filtros = String.format("%s Fecha desde %s al %s , ", filtros, (new SimpleDateFormat("dd/MM/yyyy")).format(this.busFecRegDesde), (new SimpleDateFormat("dd/MM/yyyy")).format(this.busFecRegHasta));
            }
             
            if (filtros == null || filtros.equals("")) {
                filtros = "(Todos los registros)";
            } else {
                if (filtros.substring(filtros.length() - 2).trim().equals(",")) {
                    String tmp = "";
                    tmp = filtros.substring(0, filtros.length() - 2);
                    filtros = tmp;
                }
            }
            
            Impresion imprimir = new Impresion();
            if (tipo == 0) {
                imprimir.imprimirListado("ssa_rpt_usuarios_accesos", col, filtros.toString());
            } else if (tipo == 1) {
                imprimir.exportarExcel("ssa_rpt_usuarios_accesos", col, filtros.toString());
            }
        } catch (Exception ex) {
            log.error(ex);
        } finally {
            FacesContext.getCurrentInstance().responseComplete();
        }
    }

    public List<Modulo> getLstModulo() throws ServiceException {
        this.lstModulo = getService().findByNamedQuery("Modulo.findOnlyNidModuloPadre", new Object[]{});
        return lstModulo;
    }

    /**
     * @param lstModulo the lstModulo to set
     */
    public void setLstModulo(List<Modulo> lstModulo) {
        this.lstModulo = lstModulo;
    }

    /**
     * @return the busCodUsuario
     */
    public String getBusCodUsuario() {
        return busCodUsuario;
    }

    /**
     * @param busCodUsuario the busCodUsuario to set
     */
    public void setBusCodUsuario(String busCodUsuario) {
        this.busCodUsuario = busCodUsuario;
    }

    /**
     * @return the busFecRegDesde
     */
    public java.util.Date getBusFecRegDesde() {
        return busFecRegDesde;
    }

    /**
     * @param busFecRegDesde the busFecRegDesde to set
     */
    public void setBusFecRegDesde(java.util.Date busFecRegDesde) {
        this.busFecRegDesde = busFecRegDesde;
    }

    /**
     * @return the busFecRegHasta
     */
    public java.util.Date getBusFecRegHasta() {
        return busFecRegHasta;
    }

    /**
     * @param busFecRegHasta the busFecRegHasta to set
     */
    public void setBusFecRegHasta(java.util.Date busFecRegHasta) {
        this.busFecRegHasta = busFecRegHasta;
    }

    /**
     * @return the busNomUsuario
     */
    public String getBusNomUsuario() {
        return busNomUsuario;
    }

    /**
     * @param busNomUsuario the busNomUsuario to set
     */
    public void setBusNomUsuario(String busNomUsuario) {
        this.busNomUsuario = busNomUsuario;
    }

    /**
     * @return the lstControlAcceso
     */
    public List<ControlAccesoBean> getLstControlAcceso() {
        return lstControlAcceso;
    }

    /**
     * @param lstControlAcceso the lstControlAcceso to set
     */
    public void setLstControlAcceso(List<ControlAccesoBean> lstControlAcceso) {
        this.lstControlAcceso = lstControlAcceso;
    }

    /**
     * @return the busModulo
     */
    public String getBusModulo() {
        return busModulo;
    }

    /**
     * @param busModulo the busModulo to set
     */
    public void setBusModulo(String busModulo) {
        this.busModulo = busModulo;
    }

    /**
     * @return the txtToday
     */
    public java.util.Date getTxtToday() {
        return txtToday;
    }

    /**
     * @param txtToday the txtToday to set
     */
    public void setTxtToday(java.util.Date txtToday) {
        this.txtToday = txtToday;
    }
}